#!/bin/bash
# shellcheck disable=SC2155
# 兼容环境：Bash 3.x+（macOS默认）、Linux全发行版、Windows WSL/msys
# 核心特性：无版本限制、无特殊语法依赖、处理命令缺失/路径异常

if GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null); then
    TOP_DIR="${GIT_ROOT}"
else
    # 非Git环境：用当前脚本所在目录作为基准
    SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
    TOP_DIR="${SCRIPT_DIR}/../"
fi

##############################################################################
# 1. 公共工具函数（业务脚本可直接调用）
# 系统专属操作函数（直接接收并使用传递的参数）
os_ubuntu() {
    echo "更新Ubuntu包索引..."
    sudo apt update -y
}

os_debian() {
    echo "更新Debian包索引..."
    sudo apt update -y
}

os_centos() {
    echo "更新CentOS系统包..."
    sudo yum update -y
    # echo "macOS系统操作，接收参数: $*"
    # 可直接使用参数，例如:
    # for arg in "$@"; do echo "处理参数: $arg"; done
}

os_macos() {
    echo "执行macOS操作：检查Homebrew..."
    command -v brew || /bin/bash -c "$TOP_DIR/scripts/macos/install_homebrew.sh" || /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
}

os_windows() {
    echo "执行Windows操作：检查Chocolatey..."
    command -v choco || echo "建议安装Chocolatey：https://chocolatey.org/install"
}

os_wsl() {
    echo "执行WSL操作：优化性能..."
    [ -f /etc/wsl.conf ] || echo -e "[automount]\noptions = \"metadata\"" | sudo tee /etc/wsl.conf
}

os_unknown() {
    echo "未知系统操作，接收参数: $*"
}

##############################################################################
# 安全执行命令（带错误提示和退出码）
# 参数：$1=命令内容, $2=自定义错误信息（可选）
safe_exec() {
    local cmd="$1"
    local err_msg="${2:-"命令执行失败: $cmd"}"

    echo "[$(basename "$0")] 执行: $cmd"
    if eval "$cmd"; then
        return 0
    else
        echo "[$(basename "$0")] 错误: $err_msg (退出码: $?)" >&2
        return 1
    fi
}

# 跨系统获取系统信息（无外部依赖）
get_os_details() {
    if [[ "$OSTYPE" == "darwin"* ]]; then
        # macOS：使用系统自带命令
        sw_vers | awk -F': ' '{printf "%-15s %s\n", $1, $2}'
    elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
        # Linux：多级兼容
        if command -v lsb_release &>/dev/null; then
            lsb_release -a | grep -E "Distributor|Description|Release|Codename"
        elif [[ -f "/etc/os-release" ]]; then
            grep -E "PRETTY_NAME|VERSION_ID|ID" "/etc/os-release" | sed 's/"/ /g; s/=/:\t/'
        else
            uname -sr  # 最低级兼容
        fi
    elif [[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" ]]; then
        # Windows（Cygwin/MSYS）
        systeminfo | grep -E "OS Name|OS Version" | head -n2 | sed 's/://; s/:/:\t/'
    else
        echo "未知系统: $OSTYPE"
    fi
}

##############################################################################
# 3. 系统类型检测（核心逻辑，兼容所有环境）
##############################################################################
detect_os() {
    case "$OSTYPE" in
        # Linux系统（含WSL）
        linux-gnu*)
            # 检测WSL环境（兼容WSL1/WSL2）
            if [[ -f "/proc/version" && $(grep -cE "Microsoft|WSL" "/proc/version" 2>/dev/null) -gt 0 ]]; then
                echo "wsl"
                return 0
            fi
            # 检测Linux发行版
            if [[ -f "/etc/os-release" ]]; then
                . "/etc/os-release"  # 加载发行版信息
                case "$ID" in
                    ubuntu)          echo "ubuntu"  ;;
                    debian)          echo "debian"  ;;
                    centos|rhel)     echo "centos"  ;;
                    *)                echo "unknown" ;;
                esac
            else
                echo "unknown"
            fi
            ;;
        # macOS系统
        darwin*)
            echo "macos"
            ;;
        # Windows系统
        cygwin|msys|win32)
            echo "windows"
            ;;
        # 其他未知系统
        *)
            echo "unknown"
            ;;
    esac
}

##############################################################################
# 4. 主流程控制（调用业务脚本的自定义函数）
##############################################################################
main() {

    echo "======== start $(basename "$0") ========"

    # 调用业务脚本的启动函数（如未定义则警告）
    if [[ "$(type -t cmd_start)" == "function" ]]; then
        cmd_start "$@"
    else
        echo "警告：业务脚本未实现 cmd_start 函数" >&2
    fi

    # 检测系统类型
    local os_type=$(detect_os)
    export OS_TYPE=$os_type
    echo "执行系统检查, 系统类型: $os_type"
    # 映射系统到对应的处理函数（兼容Bash 3.x，用case替代关联数组）
    local handler_func
    case "$os_type" in
        ubuntu)  handler_func="os_ubuntu"  ;;
        debian)  handler_func="os_debian"  ;;
        centos)  handler_func="os_centos"  ;;
        macos)   handler_func="os_macos"   ;;
        windows) handler_func="os_windows" ;;
        wsl)     handler_func="os_wsl"     ;;
        *)       handler_func="os_unknown" ;;
    esac
    echo "执行自定义命令"
    # 关键优化：用case替代关联数组（兼容Bash 3.x）
    local cmd_handler
    case "${os_type}" in
        ubuntu)  cmd_handler="cmd_ubuntu"  ;;
        debian)  cmd_handler="cmd_debian"  ;;
        centos)  cmd_handler="cmd_centos"  ;;
        macos)   cmd_handler="cmd_macos"   ;;
        windows) cmd_handler="cmd_windows" ;;
        wsl)     cmd_handler="cmd_wsl"     ;;
        *)       cmd_handler="cmd_unknown" ;;
    esac

    # 调用系统专属函数（透传所有参数）
    ${cmd_handler} "$@"

    # 调用系统专属函数（如未定义则提示）
    if [[ "$(type -t "$handler_func")" == "function" ]]; then
        $handler_func "$@"  # 透传所有参数
    else
        echo "警告：未实现 $handler_func 函数" >&2
    fi

    # 调用业务脚本的完成函数（如未定义则警告）
    if [[ "$(type -t cmd_complete)" == "function" ]]; then
        cmd_complete "$@"
    else
        echo "警告：业务脚本未实现 cmd_complete 函数" >&2
    fi
    if [[ -z $OS_TYPE ]];then
      cp -r "$TOP_DIR/configs/$OS_TYPE/.bashconfig" /work/bin/.bashconfig
      cp -r "$TOP_DIR/configs/$OS_TYPE/.bashconfig" "$HOME"/.bashconfig
    fi
    echo "======== complete $(basename "$0") ========"
}
